#pragma once

#include "NodoSimple.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
class Pila
{
private:
    
    NodoSimple<T>* top;  //puntero al inicio
	NodoSimple<T>* botton;
	int cantidad;
public: 
	Pila();
    ~Pila();

    bool empty();
	T* peek();  //devuelve el top pero no lo borra
	T* pop();
    void push(T*);
	int getCantidad();
    string toString();
};


template<class T>
bool Pila<T>::empty(){
   return top == botton;
}

template<class T>
T* Pila<T>::peek(){
   return top->getInfo();
}

template<class T>
T* Pila<T>::pop(){
    if(!empty())
    {
        NodoSimple<T>* aux = top;
        top = top->getSigNodo(); 
        aux->setSigNodo(NULL);
        cantidad--;
        return aux->getInfo();
    }
   return NULL;
}

template<class T>
 void Pila<T>::push(T* e){
    
    NodoSimple<T>* aux = new NodoSimple<T>(top, e);
    top= aux;
	cantidad++;
}


template<class T>
Pila<T>::Pila()
{
	top = botton = NULL; 
	cantidad = 0;
}


template<class T>
Pila<T>::~Pila()
{
	while(top!=NULL)
	{
		delete pop();
	}

}

template<class T>
string Pila<T>::toString()
{
    stringstream s;
    NodoSimple<T>* aux = top;
    while(aux!=NULL)
    {
        s<< "\t\t-------------------------\n"
        << "\t\t"<<aux->getInfo()->toString();
        aux = aux->getSigNodo();
    }
    return s.str();;
}


template<class T>
int Pila<T>::getCantidad()
{
	return cantidad;
}


